package com.blackhorse.order.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.blackhorse.order.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * @SentinelResource 配置受保护的资源
     * blockHandler：声明熔断时调用的降级方法
     * fallback：抛出异常执行的降级方法
     * value: 自定资源名称
     *  *不设置：当前全类名.方法名
     *  *设置：自定义名称
     */
//    @SentinelResource(value = "orderById",blockHandler = "orderBlockHandler", fallback = "orderBlockFallBack")
    @GetMapping("/buy/{id}")
    public Product buyProductById(@PathVariable Long id) {
        if (id <= 0) {
            throw new IllegalArgumentException("参数异常：id=" + id);
        }

        String url = "http://service-product/product/" + id; //使用ribbon时，url写服务名
        Product product = restTemplate.getForObject(url, Product.class);
        return product;
    }

    /*
        定义降级逻辑
        sentinel的降级方法分为熔断降级和异常降级两种
            熔断执行的降级方法
            抛出异常的降级方法
     */
    public Product orderBlockHandler(Long id) {
        Product product = new Product();//构造一个本地数据
        product.setProductName("熔断降级方法执行...");
        return product;
    }

    public Product orderBlockFallBack(Long id) {
        Product product = new Product();//构造一个本地数据
        product.setProductName("异常降级方法执行...");
        return product;
    }

}
